package com.example.lettcode._202411._20241127;

import java.util.*;

/*
599. 两个列表的最小索引总和
假设 Andy 和 Doris 想在晚餐时选择一家餐厅，并且他们都有一个表示最喜爱餐厅的列表，每个餐厅的名字用字符串表示。
你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个，则输出所有答案并且不考虑顺序。 你可以假设答案总是存在。

示例 1:
输入: list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"]，list2 = ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
输出: ["Shogun"]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。

示例 2:
输入:list1 = ["Shogun", "Tapioca Express", "Burger King", "KFC"]，list2 = ["KFC", "Shogun", "Burger King"]
输出: ["Shogun"]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”，它有最小的索引和1(0+1)。

提示:
1 <= list1.length, list2.length <= 1000
1 <= list1[i].length, list2[i].length <= 30
list1[i] 和 list2[i] 由空格 ' ' 和英文字母组成。
list1 的所有字符串都是 唯一 的。
list2 中的所有字符串都是 唯一 的。
 */
public class _02_liang_ge_lie_biao_zui_xiao_suo_yin_zong_he {

    public static void main(String[] args) {
        String[] list1 = {"Shogun", "Tapioca Express", "Burger King", "KFC"};
        String[] list2 = {"Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"};
        String[] restaurant = findRestaurant2(list1, list2);
        Arrays.stream(restaurant).forEach(System.out::println);
    }

    public static String[] findRestaurant(String[] list1, String[] list2) {
        Map<String, Integer> map1 = new HashMap<>();
        for (int i = 0; i < list1.length; i++) {
            map1.put(list1[i], i);
        }

        Map<String, Integer> map2 = new HashMap<>();
        for (int i = 0; i < list2.length; i++) {
            if (map1.containsKey(list2[i])) {
                map2.put(list2[i], map1.get(list2[i]) + i);
            }
        }

        int mixIndex = Integer.MAX_VALUE;
        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            Integer value = entry.getValue();
            mixIndex = Math.min(mixIndex, value);
        }

        List<String> list = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            if (entry.getValue() == mixIndex) {
                list.add(entry.getKey());
            }
        }

        return list.toArray(new String[list.size()]);
    }

    public static String[] findRestaurant2(String[] list1, String[] list2) {
        Map<String, Integer> map1 = new HashMap<>();
        for (int i = 0; i < list1.length; i++) {
            map1.put(list1[i], i);
        }

        List<String> ret = new ArrayList<>();
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < list2.length; i++) {
            if (map1.containsKey(list2[i])){
                Integer aIndex = map1.get(list2[i]);
                if (aIndex + i < min) {
                    ret.clear();
                    min = aIndex + i;
                    ret.add(list2[i]);
                } else if (aIndex + i == min) {
                    ret.add(list2[i]);
                }
            }
        }

        return ret.toArray(new String[ret.size()]);
    }
}
